home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 7684 / 7684.xpi / chrome / firefm.jar / content / fmPreferencesWindow.js < prev    next >
Text File  |  2009-06-25  |  12KB  |  359 lines

  1. /**
  2.  * Copyright (c) 2008, Jose Enrique Bolanos, Jorge Villalobos
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions are met:
  7.  *
  8.  *  * Redistributions of source code must retain the above copyright notice,
  9.  *    this list of conditions and the following disclaimer.
  10.  *  * Redistributions in binary form must reproduce the above copyright notice,
  11.  *    this list of conditions and the following disclaimer in the documentation
  12.  *    and/or other materials provided with the distribution.
  13.  *  * Neither the name of Jose Enrique Bolanos, Jorge Villalobos nor the names
  14.  *    of its contributors may be used to endorse or promote products derived
  15.  *    from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  18.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  19.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  20.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
  21.  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  22.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  23.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  24.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  25.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  26.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  27.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  **/
  29.  
  30. Components.utils.import("resource://firefm/fmCommon.js");
  31.  
  32. const Cc = Components.classes;
  33. const Ci = Components.interfaces;
  34.  
  35. /**
  36.  * FireFM chrome namespace. We need a separate one because this one is defined
  37.  * per window.
  38.  */
  39. if (typeof(FireFMChrome) == 'undefined') {
  40.   var FireFMChrome = {};
  41. };
  42.  
  43. /**
  44.  * Preferences window controller. Manages UI events that occur in the
  45.  * preferences window.
  46.  */
  47. FireFMChrome.PreferencesWindow = {
  48.   /* Regular expression used to extract the id for the status bar preference
  49.      items. */
  50.   _RE_STATUS_ID : /^([a-z\-]+)(\[[a-z]+\])?$/,
  51.   /* Logger for this object. */
  52.   _logger : null,
  53.   /* The bradcaster that disables all statusbar-related items. */
  54.   _statusbarBroadcaster : null,
  55.   /* Indicates that the Fire.fm toolbar needs to be toggled when the dialog is
  56.      accepted. */
  57.   _mustToggleToolbar : false,
  58.   /* Indicates that the Fire.fm statusbar preferences needs to be updated when
  59.      the dialog is accepted. */
  60.   _mustUpdateStatusbar : false,
  61.   /* Temporary value of the statusbar buttons preference value, in case we need
  62.      to set it once the window is accepted. */
  63.   _statusbarButtons : null,
  64.  
  65.   /**
  66.    * Initializes the object.
  67.    */
  68.   init : function() {
  69.     let that = this;
  70.     let os;
  71.  
  72.     this._logger = FireFM.getLogger("FireFMChrome.PreferencesWindow");
  73.     this._logger.debug("init");
  74.  
  75.     os = FireFM.getOperatingSystem();
  76.  
  77.     if ((FireFM.OS_WINDOWS == os) || (FireFM.OS_WINDOWS_VISTA == os)) {
  78.       document.title =
  79.         FireFM.overlayBundle.GetStringFromName("firefm.options.title");
  80.     } else {
  81.       document.title =
  82.         FireFM.overlayBundle.GetStringFromName("firefm.optionsUnix.title");
  83.     }
  84.  
  85.     // set the state for all statusbar related items.
  86.     this._statusbarBroadcaster =
  87.       document.getElementById("firefm-statusbar-broadcaster");
  88.     this.toggleStatusChecks();
  89.     this.updateStatusbarChecks();
  90.  
  91.     // set the toolbar visibility checkbox value.
  92.     document.getElementById("firefm-show-toolbar").checked =
  93.       this._getToolbarVisibility();
  94.   },
  95.  
  96.   /**
  97.    * Unloads the object.
  98.    */
  99.   uninit : function() {
  100.     this._logger.debug("uninit");
  101.   },
  102.  
  103.   /**
  104.    * Opens the Scrobble page on a browser window.
  105.    * @param aEvent the event that triggered this action.
  106.    */
  107.   openScrobblePage : function(aEvent) {
  108.     this._logger.debug("openScrobblePage");
  109.     openURL(FireFM.Remote.URL_SCROBBLE_HELP);
  110.   },
  111.  
  112.   /**
  113.    * Opens the mouse gestures page on a browser window.
  114.    * @param aEvent the event that triggered this action.
  115.    */
  116.   openGesturesPage : function(aEvent) {
  117.     this._logger.debug("openGesturesPage");
  118.     openURL(FireFM.Remote.URL_GESTURES_HELP);
  119.   },
  120.  
  121.   /**
  122.    * Clears the recent station history.
  123.    * @param aEvent the event that triggered this action.
  124.    */
  125.   clearRecentHistory : function(aEvent) {
  126.     this._logger.debug("clearRecentHistory");
  127.     // disable the button, since it will no longer do anything.
  128.     aEvent.target.setAttribute("disabled", true);
  129.     FireFM.History.clearRecentHistory();
  130.   },
  131.  
  132.   /**
  133.    * Clears the Fire.fm entries in the browser history.
  134.    * @param aEvent the event that triggered this action.
  135.    */
  136.   clearPlacesHistory : function(aEvent) {
  137.     this._logger.debug("clearPlacesHistory");
  138.  
  139.     // disable the button, since it will no longer do anything.
  140.     aEvent.target.setAttribute("disabled", true);
  141.  
  142.     // XXX: This method may take a while, depending on the amount of history
  143.     // entries, so it's best to run it in a new thread created by the opener
  144.     // window.
  145.     window.opener.setTimeout(
  146.       function() { FireFM.History.clearPlacesHistory(); }, 0);
  147.   },
  148.  
  149.   /**
  150.    * Toggles the visibility of the Fire.fm toolbar on all active windows.
  151.    * @param aEvent the event that triggered this action.
  152.    */
  153.   toggleToolbar : function(aEvent) {
  154.     this._logger.debug("toggleToolbar");
  155.  
  156.     // this preference determines if changes in preference windows should apply
  157.     // right away, or if they should apply when the window is accepted.
  158.     let instantApplyPref =
  159.       FireFM.Application.prefs.get("browser.preferences.instantApply");
  160.  
  161.     if (instantApplyPref.value) {
  162.       this._toggleToolbar();
  163.     } else {
  164.       this._mustToggleToolbar = true;
  165.     }
  166.   },
  167.  
  168.   /**
  169.    * Carries away any actions necessary when the window is closed.
  170.    * @param aEvent the event that triggered this action.
  171.    */
  172.   accept : function(aEvent) {
  173.     this._logger.debug("accept");
  174.  
  175.     if (this._mustToggleToolbar) {
  176.       this._toggleToolbar();
  177.     }
  178.  
  179.     if (this._mustUpdateStatusbar) {
  180.       this._customizeStatusbar();
  181.     }
  182.   },
  183.  
  184.   /**
  185.    * Gets the current state of visibility of the Fire.fm toolbar.
  186.    * XXX: this may be a little buggy because it depends on the state of the most
  187.    * recent window. Is that always the same as the persisted value?
  188.    * @return true if the toolbar is currently visible, false otherwise.
  189.    */
  190.   _getToolbarVisibility : function() {
  191.     this._logger.trace("_getToolbarVisibility");
  192.  
  193.     let win =
  194.       Cc["@mozilla.org/appshell/window-mediator;1"].
  195.         getService(Ci.nsIWindowMediator).
  196.           getMostRecentWindow("navigator:browser");
  197.     let visible = true; // this is the most sensible default.
  198.  
  199.     if (null != win) {
  200.       visible = !win.document.getElementById("firefm-toolbar").collapsed;
  201.     } else {
  202.       this._logger.error("_getToolbarVisibility: No browser window found!");
  203.     }
  204.  
  205.     return visible;
  206.   },
  207.  
  208.   /**
  209.    * Sets the visibility for the toolbar in all opened browser windows, and sets
  210.    * the persistence of it.
  211.    * XXX: this won't work if there is no browser window open.
  212.    */
  213.   _toggleToolbar : function() {
  214.     this._logger.trace("_toggleToolbar");
  215.  
  216.     let winMediator =
  217.       Cc["@mozilla.org/appshell/window-mediator;1"].
  218.         getService(Ci.nsIWindowMediator);
  219.     let browserWins = winMediator.getEnumerator("navigator:browser");
  220.     let shouldShow = document.getElementById("firefm-show-toolbar").checked;
  221.     let win = null;
  222.     let toolbar;
  223.  
  224.     while (browserWins.hasMoreElements()) {
  225.       win = browserWins.getNext();
  226.       toolbar = win.document.getElementById("firefm-toolbar");
  227.       toolbar.collapsed = !shouldShow;
  228.       win.document.persist("firefm-toolbar", "collapsed");
  229.     }
  230.  
  231.     if (null == win) {
  232.       this._logger.error("_toggleToolbar: No browser window found!");
  233.     }
  234.   },
  235.  
  236.   /**
  237.    * Updates the disabled/enabled state of the checkboxes that are related to
  238.    * the statusbar preference.
  239.    * @param aEvent the event that triggered this action.
  240.    */
  241.   toggleStatusChecks : function(aEvent) {
  242.     this._logger.debug("toggleStatusChecks");
  243.  
  244.     let statusPref =
  245.       document.getElementById("firefm-preference-show-statusbar");
  246.  
  247.     if (statusPref.value) {
  248.       this._statusbarBroadcaster.removeAttribute("disabled");
  249.     } else {
  250.       this._statusbarBroadcaster.setAttribute("disabled", true);
  251.     }
  252.   },
  253.  
  254.   /**
  255.    * Updates the checkboxes for the statusbar preference according to its
  256.    * current value.
  257.    * @param aEvent the event that triggered this action.
  258.    */
  259.   updateStatusbarChecks : function(aEvent) {
  260.     this._logger.debug("updateStatusbarChecks");
  261.  
  262.     let statusButtonsPref =
  263.       document.getElementById("firefm-preference-statusbar-buttons");
  264.     let buttonsStr = statusButtonsPref.value;
  265.     let buttons = ((null != buttonsStr) ? buttonsStr.split(",") : [ ]);
  266.     let buttonMatch;
  267.     let check;
  268.  
  269.     this._statusbarBroadcaster.setAttribute("checked", false);
  270.  
  271.     for (let i = 0; i < buttons.length; i++) {
  272.       buttonMatch = this._RE_STATUS_ID.exec(buttons[i]);
  273.  
  274.       if (null != buttonMatch) {
  275.         check = document.getElementById(buttonMatch[1]);
  276.  
  277.         if (null != check) {
  278.           check.checked = true;
  279.         }
  280.  
  281.         if ("firefm-status-track-info" == check.id) {
  282.           let infoSize =
  283.             document.getElementById("firefm-status-track-info-size");
  284.  
  285.           infoSize.checked =
  286.             ((2 >= buttonMatch.length) || ("[large]" != buttonMatch[2]));
  287.         }
  288.       }
  289.     }
  290.   },
  291.  
  292.   /**
  293.    * Updates the statusbar buttons preference. This change may not apply
  294.    * immediately because of a system preference that says preferences must not
  295.    * apply until the window is accepted.
  296.    * @param aEvent the event that triggered this action.
  297.    */
  298.   customizeStatusbar : function(aEvent) {
  299.     this._logger.debug("customizeStatusbar");
  300.  
  301.     // this preference determines if changes in preference windows should apply
  302.     // right away, or if they should apply when the window is accepted.
  303.     let instantApplyPref =
  304.       FireFM.Application.prefs.get("browser.preferences.instantApply");
  305.     let container = document.getElementById("firefm-status-check-container");
  306.     let checks = container.getElementsByTagName("checkbox");
  307.     let first = true;
  308.     let check = null;
  309.  
  310.     this._statusbarButtons = "";
  311.  
  312.     for (let i = 0; i < checks.length; i++) {
  313.       check = checks[i];
  314.  
  315.       if (check.checked) {
  316.         if (!first) {
  317.           this._statusbarButtons += ",";
  318.         } else {
  319.           first = false;
  320.         }
  321.  
  322.         this._statusbarButtons += check.id;
  323.  
  324.         if ("firefm-status-track-info" == check.id) {
  325.           let infoSize =
  326.             document.getElementById("firefm-status-track-info-size");
  327.  
  328.           this._statusbarButtons +=
  329.             ((infoSize.checked) ? "[small]" : "[large]");
  330.         }
  331.       }
  332.     }
  333.  
  334.     if (instantApplyPref.value) {
  335.       this._customizeStatusbar();
  336.     } else {
  337.       this._mustUpdateStatusbar = true;
  338.     }
  339.   },
  340.  
  341.   /**
  342.    * Updates the statusbar buttons preference.
  343.    * @param aEvent the event that triggered this action.
  344.    */
  345.   _customizeStatusbar : function(aEvent) {
  346.     this._logger.trace("_customizeStatusbar");
  347.  
  348.     let statusButtonsPref =
  349.       document.getElementById("firefm-preference-statusbar-buttons");
  350.  
  351.     statusButtonsPref.valueFromPreferences = this._statusbarButtons;
  352.   }
  353. };
  354.  
  355. window.addEventListener(
  356.   "load", function() { FireFMChrome.PreferencesWindow.init(); }, false);
  357. window.addEventListener(
  358.   "unload", function() { FireFMChrome.PreferencesWindow.uninit(); }, false);
  359.